package com.example.onlinemusic.controller;

import com.example.onlinemusic.mapper.UserMapper;
import com.example.onlinemusic.model.User;
import com.example.onlinemusic.tools.Constant;
import com.example.onlinemusic.tools.ResponseBodyMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.jws.soap.SOAPBinding;
import javax.servlet.http.HttpServletRequest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: H_tao_X
 * Date: 2022-12-04
 * Time: 22:40
 */
@RestController // 这个注解是 @Controller 和 @RequestBody 的组合注解
@RequestMapping("/user") // 一级路由
public class UserController {

    @Autowired
    private UserMapper userMapper; // 注入 UserMapper
                // 后面要用 UserMapper里面的方法，去进行数据查询

    @Autowired
    BCryptPasswordEncoder bCryptPasswordEncoder;

    /**
     * 1. 登录功能
     * @param username 用户名
     * @param password 密码
     * @param request 存储 session
     * @return
     */
    @RequestMapping("/login1")
    // 传递两个参数 一个是 username 一个是 password
        // 加了统一响应体类之后 返回值 不在是 void ，而是 我们的 ResponseBodyMessage
    public ResponseBodyMessage<User> login1(@RequestParam String username,
                                           @RequestParam String password,
                                           HttpServletRequest request) {
        // @RequestParam 注解，可以H后端参数重命名，也可以制定传参


        // 拿到 userLogin 对象，设置 用户名和密码
        User userLogin = new User();
        userLogin.setUsername(username);
        userLogin.setPassword(password);
        // 调用 userMapper的 login 方法 在数据库中 进行查询,返回 User
        User user =  userMapper.login(userLogin);

        if(user != null ) {
            System.out.println("登录成功！");
            // 存储 session
//            request.getSession().setAttribute("USERINFO_SESSION_KEY",user);
            // 做出优化后的代码，我们将 USERINFO_SESSION_KEY 写在我们的工具包中
            request.getSession().setAttribute(Constant.USERINFO_SESSION_KEY,user);
            /**
             * request.getSession.setAttribute()是获得当前会话的session
             * 然后再setAttribute到session里面去，有效范围是session而不是request。
             */
            // 返回响应体
            return new ResponseBodyMessage<>(0,"登录成功老铁！",userLogin);
        }else {
            System.out.println("登录失败！");
            // 登录失败，做出响应
                // 在这里规定 status -1 为失败 0为成功
            return new ResponseBodyMessage<>(-1,"登录失败老铁！",userLogin);
        }
    }


    /**
     * 实现加密登录
     */


    @RequestMapping("/login")
    // 传递两个参数 一个是 username 一个是 password
    // 加了统一响应体类之后 返回值 不在是 void ，而是 我们的 ResponseBodyMessage
    public ResponseBodyMessage<User> login(@RequestParam String username,
                                           @RequestParam String password,
                                           HttpServletRequest request) {

//        User userLogin = new User();
//        userLogin.setUsername(username);
//        userLogin.setPassword(password);
//        User user =  userMapper.login(userLogin);

        // 1. 先去查询我们 用户，是否存在
        User user = userMapper.selectByName(username);
        if(user != null ) {
            // 2. 如果用户存在，找到当前用户的密码，通过 Bcrypt 中的 matches 方法 判断密码是否一致
            // password 为原来的密码，user.getPassword 为加密后的密码
            boolean flg = bCryptPasswordEncoder.matches(password,user.getPassword());
            if(!flg) {
                // 说明密码不匹配
                return new ResponseBodyMessage<>(-1,"登录失败,用户名或密码错误",user);
            }
            System.out.println("登录成功！");
            request.getSession().setAttribute(Constant.USERINFO_SESSION_KEY,user);
            return new ResponseBodyMessage<>(0,"登录成功老铁！",user);
        }else {
            System.out.println("登录失败！");
            return new ResponseBodyMessage<>(-1,"登录失败，没找到用户！",user);
        }
    }


    /**
     * 实现注册功能
     */
    @RequestMapping("/logon")
    public ResponseBodyMessage<User> logon(@RequestParam String username,@RequestParam String password,
                                              HttpServletRequest request) {
        // 1. 先对 输入的 password 进行加密
        String newPassword = bCryptPasswordEncoder.encode(password);

        // 创建 User 对象
        User user = new User();
        // 设置账号和 账号 和 密码
        user.setUsername(username);
        user.setPassword(newPassword);
        // 在数据库中进行查询 看用户是否存在
        User user1 = userMapper.selectByName(username);
        if(user1 != null) {
            System.out.println("用户已注册");
            return new ResponseBodyMessage<>(-1,"用户已注册,换个其他的吧",user);
        }
            // 注册，往数据库中插入 新的 用户
            int ret = userMapper.insertUser(user);
            if(ret == 1) {
                System.out.println("注册成功啦，我的老baby，一起来听音乐吧！");
                return new ResponseBodyMessage<>(0,"注册成功啦，我的老baby，一起来听音乐吧！",user);
            }else {
                System.out.println("注册失败！达咩~");
                return new ResponseBodyMessage<>(-1,"注册失败！达咩~",user);
            }
    }
}
